﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tecnocom.Diagnostics;
using System.Data.Linq;
using System.Linq.Expressions;

namespace LinqToSql
{
    class ProgramSQL
    {
        static void Main(string[] args)
        {
            LinqTestDataContext context = new LinqTestDataContext();

            // Para verificar execução de queries
            context.Log = new DebugTextWriter();


            WriteExampleHeading("Exemplo - Bares em Lisboa");

            //var baresEmLisboa =
            //from barL in context.Bars
            //where barL.Localidade == "Lisboa"
            //orderby barL.Nome
            //select barL.Nome;

            //WriteResult<string>(baresEmLisboa);





            //WriteExampleHeading("Exemplo - Inserção de elemento");

            //Bar bar = new Bar() { Id = 20, Nome = "Bar 1", Localidade = "Lisboa", Entrada = 20 };

            //context.Bars.InsertOnSubmit(bar);

            //context.SubmitChanges();

            //WriteExampleHeading("Exemplo - Actualizacao de elemento");

            //bar = context.Bars.Where(e => e.Id == 20).SingleOrDefault();

            //bar.Nome = bar.Nome + " teste";

            //context.SubmitChanges();

            //WriteExampleHeading("Exemplo - Remocao de elemento");

            //bar = context.Bars.Where(e => e.Id == 20).SingleOrDefault();

            //context.Bars.DeleteOnSubmit(bar);

            //context.SubmitChanges();





            WriteExampleHeading("Exemplo - Paginacao");

            int PageSize = 3;

            int PageNumber = 2;
            var bares =
                (from barPag in context.Bars
                 select barPag).Skip((PageNumber - 1) * PageSize).Take(PageSize);

            WriteResult<Bar>(bares);






            //WriteExampleHeading("Exemplo - Query Directo");

            //IEnumerable<Bar> queryDirecto = context.ExecuteQuery<Bar>("select * from Bar order by Entrada");

            //WriteResult<Bar>(queryDirecto);



            Console.ReadLine();
        }

        #region Helper Methods

        private static void WriteExampleHeading(string descricaoExemplo)
        {
            if (first)
                first = false;
            else
                Console.WriteLine(Environment.NewLine);
            Console.WriteLine(descricaoExemplo + Environment.NewLine);
        }
        private static void WriteResult<T>(IEnumerable<T> resultados)
        {
            foreach (T resultado in resultados)
            {
                WriteObject(resultado);
            }
        }

        private static void WriteObject(object objectToWrite)
        {
            Bar obj = objectToWrite as Bar;
            if (obj != null)
            {
                Console.WriteLine("Id = " + obj.Id + ", Nome = " + obj.Nome + ", Localidade = " + obj.Localidade + ", Entrada = " + obj.Entrada);
                return;
            }

            Bebida obj2 = objectToWrite as Bebida;
            if (obj2 != null)
            {
                Console.WriteLine("Id = " + obj2.Id + ", BarId = " + obj2.IdBar + ", Nome = " + obj2.Nome + ", Preço = " + obj2.Preco);
                return;
            }

            Console.WriteLine(objectToWrite.ToString());
        }

        static bool first = true;

        #endregion
    }
}
